//
//  ZYHomeTableViewController.swift
//  CZ29WeiboZYH
//
//  Created by 沐颜澈 on 16/6/23.
//  Copyright © 2016年 muyanche. All rights reserved.
//

import UIKit
import AFNetworking

//定义cell的重用标识
private let statusCellId = "statusCellId"

class ZYHomeTableViewController: ZYVisitorViewController {

    //418  ==定义一个保存微博数据的数组
//    var statusArray:[ZYStatusModel]?
    
    let refresh = UIRefreshControl()
    
    //7.1 初始化一个空数组
    var statusArray:[ZYStatusModel] = [ZYStatusModel]()
    
    
    override func viewDidLoad() {
        
        
        super.viewDidLoad()
        
//      访客视图不管是是否登录,都需要走这个页面
        if !islogin {
            VisitorView?.setupVisitorView("visitordiscover_image_message", title: "登录后，别人评论你的微博，发给你的消息，都会在这里收到通知")
            
            return
        
        }
        
        //设置tableView的相关信息
        setupTableViewInfo()
        
        //627----------
        //在这里加载数据
        //请求数据的话,想要在这里得到数据,就需要用到闭包
        //loadStatusData()
        
        //实现闭包
//        loadStatusData { (result) -> () in
//            self.statusArray = result
//            //拿到数据之后刷新UI
//            self.tableView.reloadData()
//        }
        //改 7.1不要闭包
        //loadStatusData()
        //第一次是为false
        loadStatusData(activityView.isAnimating())
        
    }
    
    
    //设置tableView的相关属性-----------------627
    func setupTableViewInfo() {
    
        tableView.registerClass(ZYStatusCell.self, forCellReuseIdentifier: statusCellId)
        
        //指定一下tableViewCell的高度
//        tableView.rowHeight = 200
        // 自动计算行高UITableViewAutomaticDimension
        tableView.rowHeight = UITableViewAutomaticDimension
        // 预估行高(预估行高越接近真实高度越好)
        tableView.estimatedRowHeight = 200
        
        //7.1
        //设置tableView 的分割线的显示风格
        tableView.separatorStyle = .None
        
        //设置FooterView
        tableView.tableFooterView = activityView
        
        //8:04
        //let refresh = UIRefreshControl()
        //如果UIRefreshControl发生了改变,这个方法就可以监听到
        refresh.addTarget(self, action: "refreshAction", forControlEvents: UIControlEvents.ValueChanged)
        
        refresh.sendActionsForControlEvents(UIControlEvents.ValueChanged)
        
        
        tableView.addSubview(refresh)
        
        
    }
    
    //MARK: - 监听事件
    @objc private func refreshAction() {
        
        print("你来啦")
        
        loadStatusData(activityView.isAnimating())
        
//        //延迟加载
//        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
//            // 结束刷新
//            self.refresh.endRefreshing()
//        }
//    
    
    }
    
    //7.1-----------
    //懒加载控件
    private lazy var activityView:UIActivityIndicatorView = {
        
        let view = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        //设置一个颜色
        view.color = ThemeColor
        //返回view
        return view
    
    
    }()
    
    //7.9 懒加载控件
    
    
    
}

//请求数据的扩展类
extension ZYHomeTableViewController {
    
    
    
    //427  ---  4:18 加上一个闭包方便数据的调用
    //func loadStatusData(callBack:(result:[ZYStatusModel]) -> ())
    //7.1
    
    func loadStatusData(pullUp:Bool) {
        
        //在这里进行判断    7.1============
        //如果下拉刷新maxId = 0 ,代表我们需要拿最新的数据
        //如果上拉加载更多代表要拿时间更早的微博
        
        var sinceId:Int64 = 0
        var maxId:Int64 = 0
        
        if pullUp {
            
            maxId = statusArray.last?.id ?? 0
            if maxId > 0 {
                
                //这里是赋值,不能写return
                
                 maxId -= 1
            }
        
        } else {
        
            //下拉刷新
            sinceId = statusArray.first?.id ?? 0
            
        }
        
        ZYStatusDAL.checkCache(sinceId, maxId: maxId, success: { (response) -> () in
            
            self.refresh.endRefreshing()
            
            guard let resp = response as? [[String: AnyObject]] else {
                
                print("返回的数据为nil或者类型不匹配")
                return
            }

            
            }) { (error) -> () in
                 print("请求失败了\(error)")
        }
        
        
        ZYNetworkTools.sharedNetworkTools.homeLoadStatusData(sinceId, maxId: maxId, success: { (response) -> () in
            
            //721  停止动画
            self.activityView.stopAnimating()
            
            //停止刷新
            self.refresh.endRefreshing()
            
            guard let resp = response?["statuses"] as? [[String: AnyObject]] else {
                
                print("返回的数据为nil或者类型不匹配")
                return
            }
            
            //定义一个临时数组用来存储模型数据
            var tempArray:[ZYStatusModel] = [ZYStatusModel]()
            
            for dict in resp {
                //初始化一个模型类
                let statusM = ZYStatusModel(dict: dict)
                //保存数据模型
                tempArray.append(statusM)
                
            }
            
            //7.9保存微博的数据
            ZYStatusDAL.saveCache(resp)
            
            //7.1改
            // self.statusArray = tempArray
            
            //改6.30=========
            //上拉加载更多
            if pullUp {
                
                self.statusArray = self.statusArray + tempArray
                
                
            } else {
                //下拉刷新
                //空的数组 = 请求的数据 + 空的数组
                self.statusArray = tempArray + self.statusArray
            }
            
            self.tableView.reloadData()
            
            //测试打印,user个人信息的字典转模型
            //print(tempArray[0].user?.name)
            
            //请求成功执行闭包
            
            //callBack(result: tempArray)
            

            }) { (error) -> () in
                print("请求失败了\(error)")

        }
    }
//
//        ZYNetworkTools.sharedNetworkTools.homeLoadStatusData({ (response) -> () in
//            
//            guard let resp = response?["statuses"] as? [[String: AnyObject]] else {
//                
//                print("返回的数据为nil或者类型不匹配")
//                return
//            }
//            
//            //进行字典转模型
//            //定义一个临时数组用来存储模型数据
//            var tempArray:[ZYStatusModel] = [ZYStatusModel]()
//            
//            for dict in resp {
//                //初始化一个模型类
//                let statusM = ZYStatusModel(dict: dict)
//                //保存数据模型
//                tempArray.append(statusM)
//                
//            }
//            
//            //7.1改
//            self.statusArray = tempArray
//            self.tableView.reloadData()
//            //测试打印,user个人信息的字典转模型
//            //print(tempArray[0].user?.name)
//            
//            //请求成功执行闭包
//        
//            //callBack(result: tempArray)
//       
//            
//            }) { (error) -> () in
//            print("请求失败了\(error)")
//                
//        }
//        
//     }
        
        
    func second() {
    
        //请求数据
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        //因为只有登录了之后才能请求得到数据,所以一定是有值的
        let params = ["access_token": ZYUserAccountTools.sharedTools.accessToken!]
        //发送网络请求
        
        //发送网络可以使用自定义封装的网络工具类ZYNetworktools来进行封装
        
        ZYNetworkTools.sharedNetworkTools.request(MethodType.GET, urlString: urlString, parameters: params, success: { (response) -> () in
            
            guard let resp = response?["statuses"] as? [[String: AnyObject]] else {
                
                print("返回的数据为nil或者类型不匹配")
                return
            }
            
            //进行字典转模型
            //定义一个临时数组用来存储模型数据
            var tempArray:[ZYStatusModel] = [ZYStatusModel]()
            
            for dict in resp {
                //初始化一个模型类
                let statusM = ZYStatusModel(dict: dict)
                //保存数据模型
                tempArray.append(statusM)
                
            }
            //请求成功执行闭包
            //callBack(result: tempArray)
            
            
            }) { (error) -> () in
                print("请求失败了\(error)")
        }
        
    }

}


//封装
extension ZYHomeTableViewController {
    func first() {
        
        let manager = AFHTTPSessionManager()
        manager.GET("", parameters: nil, progress: nil, success: { (_, response) -> Void in
            
            // print("请求成功:\(response)")
            //判断一下请求的数据是否为nil
            guard let resp = response?["statuses"] as? [[String : AnyObject]] else {
                
                print("请数据的类型不匹配或者为nil")
                //直接返回
                return
            }
            
            //创建一个数组用来保存模型数据
            var tempArray:[ZYStatusModel] = [ZYStatusModel]()
            
            for dict in resp {
                //实例化一个模型
                let status = ZYStatusModel(dict: dict)
                //保存到数组
                tempArray.append(status)
                
            }
            //            print(tempArray)
            //print("成功\(response)")
            //数据请求成功调用闭包
           // callBack(result: tempArray)
            
            
            }) { (_, error) -> Void in
                print("请求失败:\(error)")
        }

    }

}


//实现数据源方法
extension ZYHomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//        return statusArray?.count ?? 0 7.1
        return statusArray.count
        
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        //创建cell
        let cell = tableView.dequeueReusableCellWithIdentifier(statusCellId, forIndexPath: indexPath) as! ZYStatusCell
        
        //使用自定义的cell这些就都不需要了
        //cell.backgroundColor = RandomColor()
        //cell.backgroundColor = UIColor.blueColor()
        //cell.textLabel?.text = statusArray![indexPath.row].text
        
        
        //629======给cell赋值
        //cell.status = statusArray?[indexPath.row]
        cell.status = statusArray[indexPath.row]
        
        return cell
    }
    
    //7.1  监听刷新数据--------的方法willDisplayCell
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        
        
//        print(indexPath.row)
        //如果cell滚动到最后一个并且activity没有执行动画才进行加载数据图片的旋转
        if statusArray.count == indexPath.row + 1 && !activityView.isAnimating(){
        
            //print(indexPath.row)
            
            //开启动画 已改
            activityView.startAnimating()
            
            //print(activityView.isAnimating())
            
            //请求数据
           // loadStatusData(true)
             loadStatusData(activityView.isAnimating())
        
        }
        

    }
    

}





















